package object;

public class CatTest {
	public static void main(String[] args) {
		Cat cat = new Cat("喵咪","花色");
		// 默认调用cat.toString()，因为重写了toString()所以输出的是属性值
		System.out.println(cat);
		
		Cat cat2 = new Cat("喵咪","花色");
		// 1.这两只猫是一只吗？不是!
		System.out.println(cat == cat2); // == 比较引用永远看地址是否是一个对象
		
		// 客户说比较两只猫，不看地址看属性，名字一样颜色一样就认为相同
		// 重写equals根据属性来判断是否相等
		System.out.println(cat.equals(cat2));  //this == obj
		
		System.out.println(cat.hashCode());
		System.out.println(cat2.hashCode());
		
		//java规范规定,当两个对象equals->true，那么要求hashCode必须一样
		// 反之hashCode一样，equals不一定相等
		
		// Object类被重写的方法: toString,equals,hashCode
		
	
		cat = null;
		cat2 = null;
		// 垃圾收集() -> 扫描堆找到没有被引用的对象就销毁, 被销毁对象在被销毁前调用finalize()方法
		System.gc();
		
		System.out.println("两个对象被销毁");
	}
}

/**
 * final,finally, finalize区别?
 * 1.final
 * final修饰常量值不变
 * final修饰方法不能被子类重写
 * final修饰类不能被继承
 * 2.finally
 * try-catch-finally, 无论try是否有异常，finally都会被执行，就算try-catch中有return语句，
 * 那么也先执行完finally再return
 * 3.finalize()
 * 从Object继承来的方法，每个对象被销毁之前调用的方法
 */





